from dataclasses import dataclass, field
from enum import EnumType, IntEnum
from pathlib import Path
from typing import TypedDict

from pydantic import BaseModel

from video_summarize_tools.tools.modelscope_service import ModelScopeService


class SourceUrlType(IntEnum):
    """
    源url对应的响应内容类型
    """

    DOMAIN_WEB_PAGE = 0
    """
    视频网站的视频播放html页面
    """

    VIDEO_FILE = 1
    """
    视频文件
    """

class MarkItem(BaseModel):
    """
    视频流画面元素标记信息

    Attribute:
    name(str): 标注的元素的名称或者介绍信息
    start_second(float): 该元素出现的起始时间点，单位是秒，数值是该元素在视频里开始出现时距离整个视频开始的第n秒
    end_second(float): 元素出现的结束时间点， 单位是秒，数值是该元素在视频里消失时距离整个视频开始的第n秒
    bbox(tuple[int, int, int, int]): [x_min, y_min, x_max, y_max]格式的坐标
    """

    name: str
    start_second: float
    end_second: float
    bbox: tuple[int, int, int, int]


class VideoSummarizeResult(BaseModel):
    """
    视频总结结果

    Attribute:
    understanding_result(str): 整个视频流的理解结果
    mark_items(list[MarkItem]): 视频流画面元素标记信息
    """

    understanding_result: str
    mark_items: list[MarkItem]


class State(TypedDict):
    """
    图的运行状态

    Attribute:
    source_url(str): 源文件的地址
    source_url_type(SourceUrlType): 源文件地址类型
    video_file_path(Path): 下载到本地的视频文件临时文件路径
    video_stream_file_path(Path): 视频流临时文件路径
    audio_stream_file_path(Path): 音频流临时文件路径
    audio_transcript_text(str): 音频文件的转录文本
    merge_result(str): 最终输出结果
    markdown_result_file_path(str): md分析结果文件路径
    """

    source_url: str
    source_url_type: SourceUrlType
    video_file_path: Path
    video_stream_file_path: Path
    audio_stream_file_path: Path
    audio_transcript_text: str
    video_frame_extract_fps: float
    video_stream_key_frames: list[Path]
    video_summarize_text: str
    merge_result: VideoSummarizeResult
    markdown_result_file_path: Path


@dataclass
class RuntimeContext:
    """
    运行时临时数据存放

    Attribute；
    modelscope_service(ModelScopeService): ModelScope服务实例
    video_frame_extract_fps: 视频流关键帧提取的fps
    """
    modelscope_service: ModelScopeService = field()
    video_frame_extract_fps: float = field(default=0.5)

